]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Pass 'radius' to blur APIs instead of 'sigma'
authorDaniel van Vugt <daniel.van.vugt@canonical.com>
Thu, 1 Jul 2021 08:03:57 +0000 (16:03 +0800)
committerMarge Bot <marge-bot@gnome.org>
Thu, 14 Dec 2023 18:20:59 +0000 (18:20 +0000)
Requires mutter!1908 first.

So now consumers of the clutter blur code don't have to know the
implementation is Gaussian and no longer need to convert the intended
blur radius to a sigma value.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1905>

js/ui/unlockDialog.js
src/shell-blur-effect.c
src/shell-blur-effect.h
src/st/st-private.c

index 15ed61a5620642ff7d934aef5675d421a54231a8..62b6cc3dc94ac511f87a1a1cd2c3ed480d618d26 100644 (file)
@@ -30,7 +30,7 @@ const FADE_OUT_TRANSLATION = 200;
 const FADE_OUT_SCALE = 0.3;
 
 const BLUR_BRIGHTNESS = 0.65;
-const BLUR_SIGMA = 45;
+const BLUR_RADIUS = 90;
 
 const SUMMARY_ICON_SIZE = 32;
 
@@ -668,7 +668,7 @@ export const UnlockDialog = GObject.registerClass({
             if (effect) {
                 effect.set({
                     brightness: BLUR_BRIGHTNESS,
-                    sigma: BLUR_SIGMA * themeContext.scale_factor,
+                    radius: BLUR_RADIUS * themeContext.scale_factor,
                 });
             }
         }
index 4f2acc4b9d9f59125abc0adb25b7dc412a6474f2..7a3267f91b7d21b155f476fefbfd75c411b675ec 100644 (file)
@@ -49,7 +49,7 @@ static const gchar *brightness_glsl =
 "  cogl_color_out.rgb *= brightness;                                       \n";
 
 #define MIN_DOWNSCALE_SIZE 256.f
-#define MAX_SIGMA 6.f
+#define MAX_RADIUS 12.f
 
 typedef enum
 {
@@ -84,14 +84,14 @@ struct _ShellBlurEffect
   ShellBlurMode mode;
   float downscale_factor;
   float brightness;
-  int sigma;
+  int radius;
 };
 
 G_DEFINE_TYPE (ShellBlurEffect, shell_blur_effect, CLUTTER_TYPE_EFFECT)
 
 enum {
   PROP_0,
-  PROP_SIGMA,
+  PROP_RADIUS,
   PROP_BRIGHTNESS,
   PROP_MODE,
   N_PROPS
@@ -276,18 +276,18 @@ clear_framebuffer_data (FramebufferData *fb_data)
 static float
 calculate_downscale_factor (float width,
                             float height,
-                            float sigma)
+                            float radius)
 {
   float downscale_factor = 1.0;
   float scaled_width = width;
   float scaled_height = height;
-  float scaled_sigma = sigma;
+  float scaled_radius = radius;
 
   /* This is the algorithm used by Firefox; keep downscaling until either the
    * blur radius is lower than the threshold, or the downscaled texture is too
    * small.
    */
-  while (scaled_sigma > MAX_SIGMA &&
+  while (scaled_radius > MAX_RADIUS &&
          scaled_width > MIN_DOWNSCALE_SIZE &&
          scaled_height > MIN_DOWNSCALE_SIZE)
     {
@@ -295,7 +295,7 @@ calculate_downscale_factor (float width,
 
       scaled_width = width / downscale_factor;
       scaled_height = height / downscale_factor;
-      scaled_sigma = sigma / downscale_factor;
+      scaled_radius = radius / downscale_factor;
     }
 
   return downscale_factor;
@@ -421,7 +421,7 @@ create_blur_nodes (ShellBlurEffect  *self,
 
   blur_node = clutter_blur_node_new (self->tex_width / self->downscale_factor,
                                      self->tex_height / self->downscale_factor,
-                                     self->sigma / self->downscale_factor);
+                                     self->radius / self->downscale_factor);
   clutter_paint_node_set_static_name (blur_node, "ShellBlurEffect (blur)");
   clutter_paint_node_add_child (brightness_node, blur_node);
   clutter_paint_node_add_rectangle (blur_node,
@@ -495,7 +495,7 @@ update_framebuffers (ShellBlurEffect     *self,
 
   clutter_actor_box_get_size (source_actor_box, &width, &height);
 
-  downscale_factor = calculate_downscale_factor (width, height, self->sigma);
+  downscale_factor = calculate_downscale_factor (width, height, self->radius);
 
   updated = update_actor_fbo (self, width, height, downscale_factor) &&
             update_brightness_fbo (self, width, height, downscale_factor);
@@ -615,7 +615,7 @@ shell_blur_effect_paint_node (ClutterEffect           *effect,
 
   g_assert (self->actor != NULL);
 
-  if (self->sigma > 0)
+  if (self->radius > 0)
     {
       g_autoptr (ClutterPaintNode) blur_node = NULL;
 
@@ -714,8 +714,8 @@ shell_blur_effect_get_property (GObject    *object,
 
   switch (prop_id)
     {
-    case PROP_SIGMA:
-      g_value_set_int (value, self->sigma);
+    case PROP_RADIUS:
+      g_value_set_int (value, self->radius);
       break;
 
     case PROP_BRIGHTNESS:
@@ -741,8 +741,8 @@ shell_blur_effect_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_SIGMA:
-      shell_blur_effect_set_sigma (self, g_value_get_int (value));
+    case PROP_RADIUS:
+      shell_blur_effect_set_radius (self, g_value_get_int (value));
       break;
 
     case PROP_BRIGHTNESS:
@@ -773,10 +773,10 @@ shell_blur_effect_class_init (ShellBlurEffectClass *klass)
 
   effect_class->paint_node = shell_blur_effect_paint_node;
 
-  properties[PROP_SIGMA] =
-    g_param_spec_int ("sigma",
-                      "Sigma",
-                      "Sigma",
+  properties[PROP_RADIUS] =
+    g_param_spec_int ("radius",
+                      "Radius",
+                      "Radius in pixels",
                       0, G_MAXINT, 0,
                       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
 
@@ -802,7 +802,7 @@ static void
 shell_blur_effect_init (ShellBlurEffect *self)
 {
   self->mode = SHELL_BLUR_MODE_ACTOR;
-  self->sigma = 0;
+  self->radius = 0;
   self->brightness = 1.f;
 
   self->actor_fb.pipeline = create_base_pipeline ();
@@ -819,29 +819,29 @@ shell_blur_effect_new (void)
 }
 
 int
-shell_blur_effect_get_sigma (ShellBlurEffect *self)
+shell_blur_effect_get_radius (ShellBlurEffect *self)
 {
   g_return_val_if_fail (SHELL_IS_BLUR_EFFECT (self), -1);
 
-  return self->sigma;
+  return self->radius;
 }
 
 void
-shell_blur_effect_set_sigma (ShellBlurEffect *self,
-                             int              sigma)
+shell_blur_effect_set_radius (ShellBlurEffect *self,
+                              int              radius)
 {
   g_return_if_fail (SHELL_IS_BLUR_EFFECT (self));
 
-  if (self->sigma == sigma)
+  if (self->radius == radius)
     return;
 
-  self->sigma = sigma;
+  self->radius = radius;
   self->cache_flags &= ~BLUR_APPLIED;
 
   if (self->actor)
     clutter_effect_queue_repaint (CLUTTER_EFFECT (self));
 
-  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SIGMA]);
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_RADIUS]);
 }
 
 float
index a7486ccde09b169f4a7e4bca5447b1b771ca0585..a0b216a715e54407c8783b1a69c2d3cc6b89cd92 100644 (file)
@@ -42,9 +42,9 @@ G_DECLARE_FINAL_TYPE (ShellBlurEffect, shell_blur_effect, SHELL, BLUR_EFFECT, Cl
 
 ShellBlurEffect *shell_blur_effect_new (void);
 
-int shell_blur_effect_get_sigma (ShellBlurEffect *self);
-void shell_blur_effect_set_sigma (ShellBlurEffect *self,
-                                  int              sigma);
+int shell_blur_effect_get_radius (ShellBlurEffect *self);
+void shell_blur_effect_set_radius (ShellBlurEffect *self,
+                                   int              radius);
 
 float shell_blur_effect_get_brightness (ShellBlurEffect *self);
 void shell_blur_effect_set_brightness (ShellBlurEffect *self,
index 50a22f28dbc43659719d28df1ca1a87ed8087825..f7ea118a526de52148ba5e85f91945179def290f 100644 (file)
@@ -391,7 +391,7 @@ _st_create_shadow_pipeline (StShadow    *shadow_spec,
   CoglPipeline *pipeline;
   CoglTexture *texture;
   float sampling_radius;
-  float sigma;
+  float radius;
   int src_height, dst_height;
   int src_width, dst_width;
   CoglPipeline *texture_pipeline;
@@ -403,9 +403,8 @@ _st_create_shadow_pipeline (StShadow    *shadow_spec,
   g_return_val_if_fail (shadow_spec != NULL, NULL);
   g_return_val_if_fail (src_texture != NULL, NULL);
 
-  sampling_radius = resource_scale * shadow_spec->blur;
-  sigma = sampling_radius / 2.f;
-  sampling_radius = ceilf (sampling_radius);
+  radius = resource_scale * shadow_spec->blur;
+  sampling_radius = ceilf (radius);
 
   src_width = cogl_texture_get_width (src_texture);
   src_height = cogl_texture_get_height (src_texture);
@@ -428,7 +427,7 @@ _st_create_shadow_pipeline (StShadow    *shadow_spec,
   cogl_framebuffer_orthographic (fb, 0, 0, dst_width, dst_height, 0, 1.0);
 
   /* Blur */
-  blur_node = clutter_blur_node_new (dst_width, dst_height, sigma);
+  blur_node = clutter_blur_node_new (dst_width, dst_height, radius);
   clutter_paint_node_add_rectangle (blur_node,
                                     &(ClutterActorBox) {
                                       0.f, 0.f,